// $Id: handler.h 86 2011-05-04 17:33:43Z cedric.shih@gmail.com $
/*
 * Copyright (C) 2011 Cedric Shih <cedric.shih@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifndef NIOHTTPD_HANDLER_H_
#define NIOHTTPD_HANDLER_H_

struct niohttpd_handler;

typedef struct niohttpd_handler *(*niohttpd_handler_create_cb)(void *arg);

typedef void (*niohttpd_handler_release_cb)(struct niohttpd_handler *handler,
		void *arg);

struct niohttpd_handler_factory {
	niohttpd_handler_create_cb create;
	niohttpd_handler_release_cb release;
};

struct niohttpd_context;

struct niohttpd_future;

typedef int (*niohttpd_handler_cb)(struct niohttpd_context *context,
		struct niohttpd_future *future, void *arg);

struct niohttpd_handler {
	niohttpd_handler_cb handle;
};

int niohttpd_context_reply(struct niohttpd_context *context,
		int code, const char *reason);

int niohttpd_context_reply_status_page(struct niohttpd_context *context,
		int code, const char *reason);

//typedef int (*niohttp_tunnel_readable_cb)(void *obj,
//		struct niohttpd_session *session, struct niobuffer *buffer);
//
//typedef int (*niohttp_tunnel_writable_cb)(void *obj,
//		struct niohttpd_session *session, struct niobuffer *buffer);
//
//typedef void (*niohttp_tunnel_close_cb)(void *obj);
//
//struct niohttp_tunnel {
//	niohttp_tunnel_readable_cb on_readable;
//	niohttp_tunnel_writable_cb on_writable;
//	niohttp_tunnel_close_cb on_close;
//};

struct niohttp_request;

struct niohttp_request *niohttpd_context_request(
		struct niohttpd_context *context);

struct niohttp_response;

struct niohttp_response *niohttpd_context_response(
		struct niohttpd_context *context);

//typedef int (*niohttpd_context_cb)(struct niohttpd_context *context,
//		struct niobuffer *buffer, void *arg);

int niohttpd_future_readable(struct niohttpd_future *future,
		niohttpd_handler_cb cb, void *arg);

int niohttpd_future_replyable(struct niohttpd_future *future,
		niohttpd_handler_cb cb, void *arg);

int niohttpd_future_writable(struct niohttpd_future *future,
		niohttpd_handler_cb cb, void *arg);

//struct niohttpd_context;
//
//struct niohttp_response *niohttpd_context_start_reply(
//		struct niohttpd_context *context,
//		int code, const char *reason);
//
//int niohttpd_context_open_tunnel(struct niohttpd_context *context,
//		struct niohttp_tunnel *ops, void *obj);

#endif /* NIOHTTPD_HANDLER_H_ */
